home *** CD-ROM | disk | FTP | other *** search
/ New Star Software Collection / NSS_Collection.iso / 3-252 picture publisher 50 / 1.ima / SETUPAPI.IN_ / SETUPAPI.bin
Text File  |  1994-08-30  |  39KB  |  1,209 lines

  1. '**************************************************************************
  2. '*******************************  Windows API's  **************************
  3. '**************************************************************************
  4. GLOBAL hSetup AS INTEGER
  5. GLOBAL fFrameInit AS INTEGER
  6. GLOBAL fInstallInit AS INTEGER
  7.  
  8. CONST SM_CXSCREEN = 0
  9. CONST SM_CYSCREEN = 1
  10.  
  11. CONST WF_80x87    = 1024
  12. CONST WF_CPU186   =  128
  13. CONST WF_CPU286   =    2
  14. CONST WF_CPU386   =    4
  15. CONST WF_CPU486   =    8
  16. CONST WF_STANDARD =   16
  17. CONST WF_ENHANCED =   32
  18.  
  19.  
  20. '' DoMsgBox Flags
  21.  
  22. CONST MB_OK          = 0
  23. CONST MB_ICONHAND    = 16
  24. CONST MB_TASKMODAL   = 8192
  25.  
  26.  
  27. DECLARE FUNCTION DoMsgBox LIB "mscomstf.dll" (lpText$,lpCaption$,wType%) As INTEGER
  28. DECLARE FUNCTION GetWindowsDirectory LIB "kernel" (szBuf$, cbBuf%) AS INTEGER
  29. DECLARE FUNCTION GetSystemDirectory LIB "kernel" (szBuf$, cbBuf%) AS INTEGER
  30. DECLARE FUNCTION GetProfileString LIB "kernel" (szSect$, szKey$, szDefault$, szBuf$, cbBuf%) AS INTEGER
  31. DECLARE FUNCTION GetVersion LIB "kernel" AS INTEGER
  32. DECLARE FUNCTION GetSystemMetrics LIB "user" (nIndex%) AS INTEGER
  33. DECLARE FUNCTION GetWinFlags LIB "kernel" AS LONG
  34. DECLARE FUNCTION SetWindowPos LIB "user" (hWnd%, hWndAfter%, x%, y%, cx%, cy%, fuFlags%) AS INTEGER
  35.  
  36.  
  37.  
  38. '**************************************************************************
  39. '****************************** Setup Constants ***************************
  40. '**************************************************************************
  41.  
  42.  
  43. ''Command Option Flags
  44.  
  45. CONST cmoVital       = 1
  46. CONST cmoCopy        = 2
  47. CONST cmoUndo        = 4
  48. CONST cmoRoot        = 8
  49. CONST cmoDecompress  = 16
  50. CONST cmoTimeStamp   = 32
  51. CONST cmoReadOnly    = 64
  52. CONST cmoBackup      = 128
  53. CONST cmoForce       = 256
  54. CONST cmoRemove      = 512
  55. CONST cmoOverwrite   = 1024
  56. CONST cmoAppend      = 2048
  57. CONST cmoPrepend     = 4096
  58. CONST cmoNone        = 0
  59. CONST cmoAll         = 65535
  60.  
  61.  
  62. ''File Exist Modes
  63.  
  64. CONST femExists     = 0
  65. CONST femRead       = 1
  66. CONST femWrite      = 2
  67. CONST femReadWrite  = 3
  68.  
  69.  
  70. ''Read-Only Return Code
  71.  
  72. CONST ynrcNo         = 0
  73. CONST ynrcYes        = 1
  74. CONST ynrcErr1       = 2
  75. CONST ynrcErr2       = 3
  76. CONST ynrcErr3       = 4
  77. CONST ynrcErr4       = 5
  78. CONST ynrcErr5       = 6
  79. CONST ynrcErr6       = 7
  80. CONST ynrcErr7       = 8
  81. CONST ynrcErr8       = 9
  82. CONST ynrcErr9       = 10
  83.  
  84.  
  85. ''General Return Codes
  86.  
  87. CONST grcOkay       = 0
  88. CONST grcNotOkay    = 1
  89. CONST grcUserQuit   = 48
  90.  
  91.  
  92. ''Ranges
  93.  
  94. ''CONST cbSymValMax = 8192
  95. CONST cbSymValMax = 512
  96.     ''REVIEW: symbol table will allow strings up to 8192 bytes
  97.     '' but we get Out of String Space wattdrvr error if we alloc
  98.     '' STRING$() that big. (See GetSymbolValue and GetListItem)
  99.     '' We should look into using dynamic far alloc instead of
  100.     '' STRING$ for large buffers.
  101.     '' NOTE: 8192 works okay with runtime wattdrvr, however.
  102.  
  103.  
  104. ''ON ERROR Error Codes
  105. CONST STFERR      = 1024   ''setup system error
  106. CONST STFQUIT     = 1025   ''user quit
  107.  
  108. CONST scmOff      = 0
  109. CONST scmOnIgnore = 1
  110. CONST scmOnFatal  = 2
  111.  
  112.  
  113. '**************************************************************************
  114. '********************************  Setup API's  ***************************
  115. '**************************************************************************
  116.  
  117. '' common
  118.  
  119. DECLARE FUNCTION FParseFATPathIntoPieces LIB "mscomstf.dll" (szPath$, szVol$, cbVol%, szDir$, cbDir%, szFile$, cbFile%) AS INTEGER
  120. DECLARE FUNCTION FOpenInf LIB "mscomstf.dll" (szFile$, fCheck%, fCheckSyms%) AS INTEGER
  121. DECLARE FUNCTION FSetSilent LIB "mscomstf.dll" (mode%) AS INTEGER
  122. DECLARE FUNCTION FSetBeepingMode LIB "mscomstf.dll" (mode%) AS INTEGER
  123. DECLARE FUNCTION HShowWaitCursor LIB "msshlstf.dll" AS INTEGER
  124. DECLARE FUNCTION FRestoreCursor  LIB "msshlstf.dll" (hPrev%) AS INTEGER
  125. DECLARE FUNCTION FOpenLogFile    LIB "mscomstf.dll" (szFile$, fAppend%) AS INTEGER
  126. DECLARE FUNCTION FCloseLogFile   LIB "mscomstf.dll" AS INTEGER
  127. DECLARE FUNCTION FWriteToLogFile LIB "mscomstf.dll" (sz$, fRequire%) AS INTEGER
  128. DECLARE FUNCTION CbGetInfSectionKeyField LIB "mscomstf.dll" (szSect$, szKey$, iField%, szBuf$, cbBuf%) AS INTEGER
  129. DECLARE FUNCTION FMakeListInfSectionField LIB "mscomstf.dll" (szSym$, szSect$, iField%) AS INTEGER
  130.  
  131.  
  132. ''shell
  133.  
  134. DECLARE FUNCTION FSetBitmap LIB "msshlstf.dll" (szDll$, Bitmap%) AS INTEGER
  135. DECLARE FUNCTION FSetAbout LIB "msshlstf.dll" (szAbout1$, szAbout2$) AS INTEGER
  136. DECLARE FUNCTION FDoDialog LIB "msuilstf.dll" (hwnd%, szDll$, Dlg%, szDlgProc$, HelpDlg%, szHelpProc$) AS INTEGER
  137. DECLARE FUNCTION FKillNDialogs LIB "msuilstf.dll" (n%) AS INTEGER
  138. DECLARE SUB SetWindowText LIB "User" (hwnd%, lpString$)
  139. DECLARE FUNCTION FSetSymbolValue LIB "msshlstf.dll" (szSymbol$, szValue$) AS INTEGER
  140. DECLARE FUNCTION FRemoveSymbol LIB "mscomstf.dll" (szSym$) AS INTEGER
  141. DECLARE FUNCTION CbGetSymbolValue LIB "mscomstf.dll" (szSymbol$, szValue$, Length%) AS INTEGER
  142. DECLARE FUNCTION UsGetListLength LIB "mscomstf.dll" (szSymbol$) AS INTEGER
  143. DECLARE FUNCTION CbGetListItem LIB "mscomstf.dll" (szListSymbol$, n%, szListItem$, cbMax%) AS INTEGER
  144. DECLARE FUNCTION FAddListItem LIB "mscomstf.dll" (szListSymbol$, szListItem$) AS INTEGER
  145. DECLARE FUNCTION FReplaceListItem LIB "mscomstf.dll" (szListSymbol$, n%, szListItem$) AS INTEGER
  146. DECLARE FUNCTION FSetSymbolToListOfInfKeys LIB "mscomstf.dll" (szSym$, szSect$, fNulls%) AS INTEGER
  147.  
  148.  
  149. ''shell
  150.  
  151. DECLARE SUB MaximizeFrame
  152. DECLARE FUNCTION InitializeFrame LIB "msshlstf.dll" (szCmdLine$) AS INTEGER
  153. DECLARE FUNCTION HwndFrame LIB "msshlstf.dll" AS INTEGER
  154. DECLARE FUNCTION HinstFrame LIB "msshlstf.dll" AS INTEGER
  155.  
  156.  
  157.  
  158. ''install
  159.  
  160. DECLARE SUB      ProSetPos LIB "msinsstf.dll" (x%, y%)
  161. DECLARE FUNCTION FCreateDir LIB "msinsstf.dll" (szDir$, cmo%) AS INTEGER
  162. DECLARE FUNCTION FRemoveDir LIB "msinsstf.dll" (szDir$, cmo%) AS INTEGER
  163. DECLARE FUNCTION FAddSectionFilesToCopyList LIB "mscomstf.dll" (szSect$, szSrc$, szDest$) AS INTEGER
  164. DECLARE FUNCTION FAddSectionKeyFileToCopyList LIB "mscomstf.dll" (szSect$, szKey$, szSrc$, szDest$) AS INTEGER
  165. DECLARE FUNCTION FAddSpecialFileToCopyList LIB "mscomstf.dll" (szSect$, szKey$, szSrc$, szDest$) AS INTEGER
  166. DECLARE FUNCTION GrcCopyFilesInCopyList LIB "msinsstf.dll" (hInstance%) AS INTEGER
  167. DECLARE FUNCTION FRemoveIniSection LIB "msinsstf.dll" (szFile$, szSect$, cmo%) AS INTEGER
  168. DECLARE FUNCTION FCreateIniKeyValue LIB "msinsstf.dll" (szFile$, szSect$, szKey$, szValue$, cmo%) AS INTEGER
  169. DECLARE FUNCTION FRemoveIniKey LIB "msinsstf.dll" (szFile$, szSect$, szKey$, cmo%) AS INTEGER
  170. DECLARE FUNCTION FCreateSysIniKeyValue LIB "msinsstf.dll" (szFile$, szSect$, szKey$, szValue$, cmo%) AS INTEGER
  171. DECLARE FUNCTION FCreateProgManGroup LIB "msinsstf.dll" (szGroup$, szPath$, cmo%) AS INTEGER
  172. DECLARE FUNCTION FCreateProgManItem LIB "msinsstf.dll" (szGroup$, szItem$, szCmd$, cmo%) AS INTEGER
  173. DECLARE FUNCTION FShowProgManGroup LIB "msinsstf.dll" (szGroup$, szCmd$, cmo%) AS INTEGER
  174. DECLARE FUNCTION FStampResource LIB "msinsstf.dll" (szSect$, szKey$, szDst$, wResType%, wResId%, szData$, cbData%) AS INTEGER
  175. DECLARE FUNCTION FDumpCopyListToFile LIB "msinsstf.dll" (szFile$) AS INTEGER
  176. DECLARE SUB      ResetCopyList LIB "msinsstf.dll"
  177. DECLARE FUNCTION LcbGetCopyListCost LIB "msinsstf.dll" (szExtraList$, szCostList$, szNeedList$) AS LONG
  178. DECLARE FUNCTION FAddDos5Help LIB "msinsstf.dll" (szProgName$, szProgHelp$, cmo%) AS INTEGER
  179. DECLARE FUNCTION FCopyOneFile LIB "msinsstf.dll" (szSrc$, szDest$, cmo%, fAppend%) AS INTEGER
  180. DECLARE FUNCTION YnrcRemoveFile LIB "msinsstf.dll" (szFullPathSrc$, cmo%) AS INTEGER
  181. DECLARE FUNCTION YnrcBackupFile LIB "msinsstf.dll" (szFullPath$, szBackup$, cmo%) AS INTEGER
  182. DECLARE FUNCTION FInitializeInstall LIB "msinsstf.dll" (hinst%, hwndFrame%) AS INTEGER
  183. DECLARE FUNCTION WFindFileUsingFileOpen LIB "msinsstf.dll" (szFile$, szBuf$, cbBuf%) AS INTEGER
  184. DECLARE FUNCTION FIsDirWritable LIB "msinsstf.dll" (szDir$) AS INTEGER
  185. DECLARE FUNCTION FIsFileWritable LIB "msinsstf.dll" (szFile$) AS INTEGER
  186. DECLARE FUNCTION FAddToBillboardList LIB "msinsstf.dll" (szDll$, idDlg%, szProc$, lTicks&) AS INTEGER
  187. DECLARE FUNCTION FClearBillboardList LIB "msinsstf.dll" AS INTEGER
  188. DECLARE FUNCTION FSetRestartDir LIB "msinsstf.dll" (szDir$) AS INTEGER
  189. DECLARE FUNCTION FRestartListEmpty LIB "msinsstf.dll" AS INTEGER
  190. DECLARE FUNCTION FExitExecRestart LIB "msinsstf.dll" AS INTEGER
  191. DECLARE FUNCTION SetCopyMode LIB "msinsstf.dll" (fMode%) AS INTEGER
  192. DECLARE FUNCTION GetCopyMode LIB "msinsstf.dll" AS INTEGER
  193. DECLARE FUNCTION SetDecompMode LIB "msinsstf.dll" (fMode%) AS INTEGER
  194. DECLARE FUNCTION GetDecompMode LIB "msinsstf.dll" AS INTEGER
  195. DECLARE FUNCTION SetSizeCheckMode LIB "msinsstf.dll" (scmMode%) AS INTEGER
  196. DECLARE FUNCTION FPrependToPath LIB "msinsstf.dll" (szSrc$, szDst$, szDir$, cmo%) AS INTEGER
  197.  
  198. DECLARE FUNCTION SetTimeValue LIB "msinsstf.dll" (usHours%, usMinutes%, usSeconds%) AS INTEGER
  199.  
  200.  
  201.  
  202. '*************************************************************************
  203. '****************  Setup Basic Wrapper Declarations  *********************
  204. '*************************************************************************
  205.  
  206.  
  207. ''shell
  208.  
  209. DECLARE SUB SetBitmap(szDll$, Bitmap%)
  210. DECLARE SUB SetAbout(szAbout1$, szAbout2$)
  211. DECLARE FUNCTION UIStartDlg(szDll$, Dlg%, szDlgProc$, HelpDlg%, szHelpProc$) AS STRING
  212. DECLARE SUB UIPop (n%)
  213. DECLARE SUB UIPopAll
  214. DECLARE SUB SetTitle (sz$)
  215. DECLARE SUB ReadInfFile (szFile$)
  216. DECLARE SUB SetSymbolValue (szSymbol$, szValue$)
  217. DECLARE SUB RemoveSymbol (szSym$)
  218. DECLARE FUNCTION GetSymbolValue (szSymbol$) AS STRING
  219. DECLARE FUNCTION GetListLength(szSymbol$) AS INTEGER
  220. DECLARE SUB MakeListFromSectionKeys (szSymbol$, szSect$)
  221. DECLARE FUNCTION GetListItem(szSymbol$, n%) AS STRING
  222. DECLARE SUB AddListItem(szSymbol$, szItem$)
  223. DECLARE SUB ReplaceListItem(szSymbol$, n%, szItem$)
  224.  
  225. DECLARE FUNCTION InitFrame (szCmdLine$) AS INTEGER
  226. DECLARE FUNCTION InitSetup (szCmdLine$) AS INTEGER
  227.  
  228. DECLARE FUNCTION ShowWaitCursor AS INTEGER
  229. DECLARE SUB RestoreCursor (hPrev%)
  230.  
  231. DECLARE FUNCTION SetBeepingMode (mode%) AS INTEGER
  232. DECLARE FUNCTION SetSilentMode (mode%) AS INTEGER
  233.  
  234. DECLARE FUNCTION GetSectionKeyDate (szSect$, szKey$) AS STRING
  235. DECLARE FUNCTION GetSectionKeyFilename (szSect$, szKey$) AS STRING
  236. DECLARE FUNCTION GetSectionKeySize (szSect$, szKey$) AS LONG
  237. DECLARE FUNCTION GetSectionKeyVersion (szSect$, szKey$) AS STRING
  238.  
  239. DECLARE SUB MakeListFromSectionDate (szSym$, szSect$)
  240. DECLARE SUB MakeListFromSectionFilename (szSym$, szSect$)
  241. DECLARE SUB MakeListFromSectionSize (szSym$, szSect$)
  242. DECLARE SUB MakeListFromSectionVersion (szSym$, szSect$)
  243.  
  244.  
  245. ''install
  246.  
  247.  
  248. DECLARE SUB CreateDir (szDir$, cmo%)
  249. DECLARE SUB RemoveDir (szDir$, cmo%)
  250. DECLARE SUB AddSectionFilesToCopyList (szSect$, szSrc$, szDest$)
  251. DECLARE SUB AddSectionKeyFileToCopyList (szSect$, szKey$, szSrc$, szDest$)
  252. DECLARE SUB AddSpecialFileToCopyList (szSect$, szKey$, szSrc$, szDest$)
  253. DECLARE SUB CopyFilesInCopyList
  254. DECLARE SUB RemoveIniSection (szFile$, szSect$, cmo%)
  255. DECLARE SUB CreateIniKeyValue (szFile$, szSect$, szKey$, szValue$, cmo%)
  256. DECLARE SUB RemoveIniKey (szFile$, szSect$, szKey$, cmo%)
  257. DECLARE SUB CreateSysIniKeyValue (szFile$, szSect$, szKey$, szValue$, cmo%)
  258. DECLARE SUB CreateProgmanGroup (szGroup$, szPath$, cmo%)
  259. DECLARE SUB CreateProgmanItem (szGroup$, szItem$, szCmd$, szOther$, cmo%)
  260. DECLARE SUB ShowProgmanGroup (szGroup$, Cmd%, cmo%)
  261. DECLARE SUB StampResource (szSect$, szKey$, szDst$, wResType%, wResId%, szData$, cbData%)
  262. DECLARE SUB DumpCopyList (szFile$)
  263. DECLARE SUB ClearCopyList
  264. DECLARE FUNCTION GetCopyListCost (szExtraList$, szCostList$, szNeedList$) AS LONG
  265. DECLARE SUB CopyFile (szFullPathSrc$, szFullPathDst$, cmo%, fAppend%)
  266. DECLARE SUB RemoveFile (szFullPathSrc$, cmo%)
  267. DECLARE SUB BackupFile (szFullPath$, szBackup$)
  268. DECLARE SUB RenameFile (szFullPath$, szBackup$)
  269. DECLARE SUB InitInstall
  270. DECLARE SUB AddToBillboardList (szDll$, idDlg%, szProc$, lTicks&)
  271. DECLARE SUB ClearBillboardList
  272. DECLARE SUB SetCopyGaugePosition (x%, y%)
  273. DECLARE SUB SetRestartDir(szDir$)
  274. DECLARE FUNCTION RestartListEmpty AS INTEGER
  275. DECLARE FUNCTION ExitExecRestart AS INTEGER
  276. DECLARE FUNCTION FindFileUsingFileOpen (szFile$) AS STRING
  277. DECLARE FUNCTION IsDirWritable (szDir$) AS INTEGER
  278. DECLARE FUNCTION IsFileWritable (szFile$) AS INTEGER
  279.  
  280. '' Error Handling
  281.  
  282. '$ifdef DEBUG
  283.  
  284. '' Setup API Errors
  285. CONST saeFail   = 0
  286. CONST saeInit   = 1
  287. CONST saeNYI    = 3
  288. CONST saeArg    = 4    ''must be max sae value
  289.  
  290. DECLARE SUB StfApiErr (nMsg%, szApi$, szArgs$)
  291. DECLARE SUB BadArgErr (nArg%, szApi$, szArgs$)
  292.  
  293. '' chk arg
  294. DECLARE FUNCTION FValidFATDir LIB "mscomstf.dll" (szDir$) AS INTEGER
  295. DECLARE FUNCTION CchlValidFATSubPath LIB "mscomstf.dll" (szPath$) AS INTEGER
  296. DECLARE FUNCTION FValidFATPath LIB "mscomstf.dll" (szPath$) AS INTEGER
  297. DECLARE FUNCTION FValidDrive (szDrive$) AS INTEGER
  298.  
  299. DECLARE FUNCTION FValidInfSect (szSect$) AS INTEGER
  300. DECLARE FUNCTION FValidIniFile (szFile$) AS INTEGER
  301.  
  302. '$endif ''DEBUG
  303.  
  304.  
  305.  
  306. '' Windows system detect
  307.  
  308. DECLARE FUNCTION GetWindowsDir  AS STRING
  309. DECLARE FUNCTION GetWindowsSysDir AS STRING
  310. DECLARE FUNCTION IsWindowsShared AS INTEGER
  311.  
  312.  
  313. '*************************************************************************
  314. '*****************  Setup Basic Wrapper Definitions  *********************
  315. '*************************************************************************
  316. FUNCTION InitSetup(szCmdLine$) STATIC AS INTEGER
  317.     fFrameInit = 0
  318.     fInstallInit = 0
  319.  
  320.     IF hSetup > 0 THEN
  321. '$ifdef DEBUG
  322.         StfApiErr saeInit, "InitSetup", szCmdLine$
  323. '$endif ''DEBUG
  324.     END IF
  325.  
  326.     i% = InitFrame(szCmdLine$)
  327.     fFrameInit = 1
  328.  
  329.     InitInstall
  330.     fInstallInit = 1
  331.  
  332.     InitSetup = i%
  333. END FUNCTION
  334.  
  335.  
  336. '*************************************************************************
  337. SUB UIPopAll STATIC
  338.     IF FKillNDialogs(65535) = 0 THEN
  339. '$ifdef DEBUG
  340.         StfApiErr saeFail, "UIPopAll", ""
  341. '$endif ''DEBUG
  342.         ERROR STFERR
  343.     END IF
  344. END SUB
  345.  
  346.  
  347. '**************************************************************************
  348. FUNCTION InitFrame(szCmdLine$) STATIC AS INTEGER
  349.     IF hSetup > 0 THEN
  350. '$ifdef DEBUG
  351.         StfApiErr saeInit, "InitFrame", szCmdLine$
  352. '$endif ''DEBUG
  353.     ELSE
  354.         i% = InitializeFrame(szCmdLine$)
  355.         IF i% = -1 THEN
  356.             END   '' NOT an error - Usage (/?) or Command line copy operation
  357.         ELSEIF i% = 0 THEN
  358. '$ifdef DEBUG
  359.             StfApiErr saeFail, "InitFrame", szCmdLine$
  360. '$endif ''DEBUG
  361.             END
  362.         ELSE
  363.             InitFrame = i%
  364.         END IF
  365.     END IF
  366. END FUNCTION
  367.  
  368.  
  369. '**************************************************************************
  370. SUB SetBitmap(szDll$, Bitmap%) STATIC
  371.     IF FSetBitmap(szDll$, Bitmap%) = 0 THEN
  372. '$ifdef DEBUG
  373.         StfApiErr saeFail, "SetBitmap", szDll$+","+STR$(Bitmap%)
  374. '$endif ''DEBUG
  375.         ERROR STFERR
  376.     END IF
  377. END SUB
  378.  
  379.  
  380. '**************************************************************************
  381.  
  382. '*************************************************************************
  383. SUB SetTitle(sz$) STATIC
  384.     SetWindowText HwndFrame(), sz$
  385. END SUB
  386.  
  387.  
  388. '*************************************************************************
  389. SUB ReadInfFile (szFile$) STATIC
  390. '$ifdef DEBUG
  391.     if FValidFATPath(szFile$) = 0 then
  392.         BadArgErr 1, "ReadInfFile", szFile$
  393.     end if
  394.     IF FOpenInf(szFile$, 1, 1) = 0 THEN
  395.         StfApiErr saeFail, "ReadInfFile", szFile$
  396. '$else  ''!DEBUG
  397.     IF FOpenInf(szFile$, 1, 0) = 0 THEN
  398. '$endif ''!DEBUG
  399.         ERROR STFERR
  400.     END IF
  401. END SUB
  402.  
  403.  
  404. '*************************************************************************
  405. FUNCTION UIStartDlg(szDll$, Dlg%, szDlgProc$, HelpDlg%, szHelpProc$) STATIC AS STRING
  406. '$ifdef DEBUG
  407.     if szDll$ = "" then
  408.         n% = 1
  409.     elseif szDlgProc$ = "" then
  410.         n% = 3
  411.     else
  412.         n% = 0
  413.     end if
  414.     if n% > 0 then
  415.         BadArgErr n%, "UIStartDlg", szDll$+", "+STR$(Dlg%)+", "+szDlgProc$+", "+STR$(HelpDlg%)+", "+szHelpProc$
  416.     end if
  417. '$endif ''DEBUG
  418.  
  419.     IF FDoDialog(HwndFrame(), szDll$, Dlg%, szDlgProc$, HelpDlg%, szHelpProc$) = 0 THEN
  420. '$ifdef DEBUG
  421.         StfApiErr saeFail, "UIStartDlg", szDll$+", "+STR$(Dlg%)+", "+szDlgProc$+", "+STR$(HelpDlg%)+", "+szHelpProc$
  422. '$endif ''DEBUG
  423.         ERROR STFERR
  424.     ELSE
  425.         UIStartDlg = GetSymbolValue("DLGEVENT")
  426.     END IF
  427. END FUNCTION
  428.  
  429.  
  430. '*************************************************************************
  431. SUB UIPop (n%) STATIC
  432.     IF FKillNDialogs(n%) = 0 THEN
  433. '$ifdef DEBUG
  434.         StfApiErr saeFail, "UIPop", STR$(n%)
  435. '$endif ''DEBUG
  436.         ERROR STFERR
  437.     END IF
  438. END SUB
  439.  
  440.  
  441. '*************************************************************************
  442. FUNCTION SetBeepingMode (mode%) STATIC AS INTEGER
  443.     SetBeepingMode = FSetBeepingMode(mode%)
  444. END FUNCTION
  445.  
  446. '*************************************************************************
  447. FUNCTION GetSymbolValue(szSymbol$) STATIC AS STRING
  448. '$ifdef DEBUG
  449.     if szSymbol$ = "" then
  450.         BadArgErr 1, "GetSymbolValue", szSymbol$
  451.     end if
  452. '$endif ''DEBUG
  453.     szValue$ = string$(cbSymValMax,128)
  454.     Length% = CbGetSymbolValue(szSymbol$, szValue$, cbSymValMax)
  455.     GetSymbolValue = szValue$
  456.     IF Length% >= cbSymValMax THEN
  457.         res% = DoMsgBox("Buffer Overflow", "MS-Setup Error", MB_ICONHAND+MB_OK)
  458.         ERROR STFERR
  459.     END IF
  460.     IF szSymbol$ = "" THEN
  461.         ERROR STFERR
  462.     END IF
  463.     szValue$ = ""
  464. END FUNCTION
  465.  
  466.  
  467. '*************************************************************************
  468. FUNCTION GetListLength(szSymbol$) STATIC AS INTEGER
  469. '$ifdef DEBUG
  470.     if szSymbol$ = "" then
  471.         BadArgErr 1, "GetListLength", szSymbol$
  472.     end if
  473. '$endif ''DEBUG
  474.     GetListLength = UsGetListLength(szSymbol$)
  475.     IF szSymbol$ = "" THEN
  476.         ERROR STFERR
  477.     END IF
  478. END FUNCTION
  479.  
  480.  
  481. '*************************************************************************
  482. FUNCTION GetListItem(szListSymbol$, nItem%) STATIC AS STRING
  483. '$ifdef DEBUG
  484.     if szListSymbol$ = "" then
  485.         BadArgErr 1, "GetListItem", szListSymbol$+", "+STR$(nItem%)
  486.     end if
  487.  
  488.     if nItem% <= 0 or nItem% > GetListLength(szListSymbol$) then
  489.         BadArgErr 2, "GetListItem", szListSymbol$+", "+STR$(nItem%)
  490.     end if
  491. '$endif ''DEBUG
  492.  
  493.     szListItem$ = string$(cbSymValMax,32)
  494.     Length% = CbGetListItem(szListSymbol$, nItem%, szListItem$, cbSymValMax)
  495.     GetListItem = szListItem$
  496.     IF Length% >= cbSymValMax THEN
  497.         res% = DoMsgBox("Buffer Overflow", "MS-Setup Error", MB_ICONHAND+MB_OK)
  498.         ERROR STFERR
  499.     END IF
  500.     IF szListSymbol$ = "" THEN
  501.         ERROR STFERR
  502.     END IF
  503.     if nItem% <= 0 or nItem% > GetListLength(szListSymbol$) then
  504.         ERROR STFERR
  505.     end if
  506.     szListItem$ = ""
  507. END FUNCTION
  508.  
  509.  
  510. '*************************************************************************
  511. SUB AddListItem(szSymbol$, szItem$) STATIC
  512. '$ifdef DEBUG
  513.     if szSymbol$ = "" then
  514.         BadArgErr 1, "AddListItem", szSymbol$+", "+szItem$
  515.     end if
  516. '$endif ''DEBUG
  517.     IF FAddListItem(szSymbol$, szItem$) = 0 THEN
  518. '$ifdef DEBUG
  519.         StfApiErr saeFail, "AddListItem", szSymbol$+", "+szItem$
  520. '$endif ''DEBUG
  521.         ERROR STFERR
  522.     END IF
  523. END SUB
  524.  
  525.  
  526. '*************************************************************************
  527. SUB ReplaceListItem(szSymbol$, n%, szItem$) STATIC
  528. '$ifdef DEBUG
  529.     if szSymbol$ = "" then
  530.         nArg% = 1
  531.     elseif (n% <= 0) OR (n% > GetListLength(szSymbol$)) then
  532.         nArg% = 2
  533.     else
  534.         nArg% = 0
  535.     end if
  536.     if nArg% > 0 then
  537.         BadArgErr nArg%, "ReplaceListItem", szSymbol$+", "+STR$(n%)+", "+szItem$
  538.     end if
  539. '$endif ''DEBUG
  540.  
  541.     IF FReplaceListItem(szSymbol$, n%, szItem$) = 0 THEN
  542. '$ifdef DEBUG
  543.         StfApiErr saeFail, "ReplaceListItem", szSymbol$+", "+STR$(n%)+", "+szItem$
  544. '$endif ''DEBUG
  545.         ERROR STFERR
  546.     END IF
  547. END SUB
  548.  
  549.  
  550. '**************************************************************************
  551. SUB MakeListFromSectionKeys(szSymbol$, szSect$) STATIC
  552. '$ifdef DEBUG
  553.     if szSymbol$ = "" then
  554.         n% = 1
  555.     elseif FValidInfSect(szSect$) = 0 then
  556.         n% = 2
  557.     else
  558.         n% = 0
  559.     end if
  560.     if n% > 0 then
  561.         BadArgErr n%, "MakeListFromSectionKeys", szSymbol$+", "+szSect$
  562.     end if
  563. '$endif ''DEBUG
  564.  
  565.     IF FSetSymbolToListOfInfKeys(szSymbol$, szSect$, 1) = 0 THEN
  566. '$ifdef DEBUG
  567.         StfApiErr saeFail, "MakeListFromSectionKeys", szSymbol$+", "+szSect$
  568. '$endif ''DEBUG
  569.         ERROR STFERR
  570.     END IF
  571. END SUB
  572.  
  573.  
  574. '*************************************************************************
  575. SUB SetSymbolValue(szSymbol$, szValue$) STATIC
  576. '$ifdef DEBUG
  577.     if szSymbol$ = "" then
  578.         BadArgErr 1, "SetSymbolValue", szSymbol$+", "+szValue$
  579.     end if
  580. '$endif ''DEBUG
  581.     IF FSetSymbolValue(szSymbol$, szValue$) = 0 THEN
  582. '$ifdef DEBUG
  583.         StfApiErr saeFail, "SetSymbolValue", szSymbol$+", "+szValue$
  584. '$endif ''DEBUG
  585.         ERROR STFERR
  586.     END IF
  587. END SUB
  588.  
  589.  
  590. '*************************************************************************
  591. SUB RemoveSymbol(szSym$) STATIC
  592. '$ifdef DEBUG
  593.     if szSym$ = "" then
  594.         BadArgErr 1, "RemoveSymbol", szSym$
  595.     end if
  596. '$endif ''DEBUG
  597.     IF FRemoveSymbol(szSym$) = 0 THEN
  598. '$ifdef DEBUG
  599.         StfApiErr saeFail, "RemoveSymbol", szSym$
  600. '$endif ''DEBUG
  601.         ERROR STFERR
  602.     END IF
  603. END SUB
  604.  
  605.  
  606. '*************************************************************************
  607. FUNCTION ShowWaitCursor STATIC AS INTEGER
  608.     ShowWaitCursor = HShowWaitCursor
  609. END FUNCTION
  610.  
  611.  
  612. '*************************************************************************
  613. SUB RestoreCursor (hPrev%) STATIC
  614.     i% = FRestoreCursor(hPrev%)
  615.     IF i% = 0 THEN
  616. '$ifdef DEBUG
  617.         StfApiErr saeFail, "RestoreCursor", ""
  618. '$endif ''DEBUG
  619.         ERROR STFERR
  620.     END IF
  621. END SUB
  622.  
  623. '*************************************************************************
  624. SUB InitInstall STATIC
  625.     IF hSetup > 0 THEN
  626. '$ifdef DEBUG
  627.         StfApiErr saeInit, "InitInstall", ""
  628. '$endif ''DEBUG
  629.     ELSEIF FInitializeInstall(HinstFrame(), HwndFrame()) = 0 THEN
  630. '$ifdef DEBUG
  631.         StfApiErr saeFail, "InitInstall", ""
  632. '$endif ''DEBUG
  633.         END
  634.     END IF
  635. END SUB
  636.  
  637.  
  638. '*************************************************************************
  639. SUB CreateDir (szDir$, cmo%) STATIC
  640. '$ifdef DEBUG
  641.     if FValidFATDir(szDir$) = 0 then
  642.         BadArgErr 1, "CreateDir", szDir$+", "+STR$(cmo%)
  643.     end if
  644. '$endif ''DEBUG
  645.     IF FCreateDir(szDir$, cmo%) = 0 THEN
  646. '$ifdef DEBUG
  647.         StfApiErr saeFail, "CreateDir", szDir$+", "+STR$(cmo%)
  648. '$endif ''DEBUG
  649.         ERROR STFERR
  650.     END IF
  651. END SUB
  652.  
  653.  
  654. '*************************************************************************
  655.  
  656. SUB RemoveIniSection (szFile$, szSect$, cmo%) STATIC
  657. '$ifdef DEBUG
  658.     if FValidIniFile(szFile$) = 0 then
  659.         n% = 1
  660.     elseif FValidInfSect(szSect$) = 0 then
  661.         n% = 2
  662.     else
  663.         n% = 0
  664.     end if
  665.     if n% > 0 then
  666.         BadArgErr n%, "RemoveIniSection", szFile$+", "+szSect$+", "+STR$(cmo%)
  667.     end if
  668. '$endif ''DEBUG
  669.  
  670.     IF FRemoveIniSection(szFile$, szSect$, cmo%) = 0 THEN
  671. '$ifdef DEBUG
  672.         StfApiErr saeFail, "RemoveIniSection", szFile$+", "+szSect$+", "+STR$(cmo%)
  673. '$endif ''DEBUG
  674.         ERROR STFERR
  675.     END IF
  676. END SUB
  677.  
  678.  
  679. '*************************************************************************
  680. SUB CreateIniKeyValue (szFile$, szSect$, szKey$, szValue$, cmo%) STATIC
  681. '$ifdef DEBUG
  682.     if FValidIniFile(szFile$) = 0 then
  683.         n% = 1
  684.     elseif FValidInfSect(szSect$) = 0 then
  685.         n% = 2
  686.     else
  687.         n% = 0
  688.     end if
  689.     if n% > 0 then
  690.         BadArgErr n%, "CreateIniKeyValue", szFile$+", "+szSect$+", "+szKey$+", "+szValue$+", "+STR$(cmo%)
  691.     end if
  692. '$endif ''DEBUG
  693.  
  694.     IF FCreateIniKeyValue(szFile$, szSect$, szKey$, szValue$, cmo%) = 0 THEN
  695. '$ifdef DEBUG
  696.         StfApiErr saeFail, "CreateIniKeyValue", szFile$+", "+szSect$+", "+szKey$+", "+szValue$+", "+STR$(cmo%)
  697. '$endif ''DEBUG
  698.         ERROR STFERR
  699.     END IF
  700. END SUB
  701.  
  702.  
  703. '*************************************************************************
  704. SUB RemoveIniKey (szFile$, szSect$, szKey$, cmo%) STATIC
  705. '$ifdef DEBUG
  706.     if FValidIniFile(szFile$) = 0 then
  707.         n% = 1
  708.     elseif FValidInfSect(szSect$) = 0 then
  709.         n% = 2
  710.     elseif szKey$ = "" then
  711.         n% = 3
  712.     else
  713.         n% = 0
  714.     end if
  715.     if n% > 0 then
  716.         BadArgErr n%, "RemoveIniKey", szFile$+", "+szSect$+", "+szKey$+", "+STR$(cmo%)
  717.     end if
  718. '$endif ''DEBUG
  719.  
  720.     IF FRemoveIniKey(szFile$, szSect$, szKey$, cmo%) = 0 THEN
  721. '$ifdef DEBUG
  722.         StfApiErr saeFail, "RemoveIniKey", szFile$+", "+szSect$+", "+szKey$+", "+STR$(cmo%)
  723. '$endif ''DEBUG
  724.         ERROR STFERR
  725.     END IF
  726. END SUB
  727.  
  728.  
  729. '*************************************************************************
  730. SUB CreateProgmanGroup (szGroup$, szPath$, cmo%) STATIC
  731. '$ifdef DEBUG
  732.     if szGroup$ = "" or len(szGroup$) > 24 then
  733.         BadArgErr 1, "CreateProgmanGroup", szGroup$+", "+STR$(Cmd%)+", "+STR$(cmo%)
  734.     end if
  735. '$endif ''DEBUG
  736.     IF FCreateProgManGroup(szGroup$, szPath$, cmo%) = 0 THEN
  737. '$ifdef DEBUG
  738.         StfApiErr saeFail, "CreateProgmanGroup", szGroup$+", "+szPath$+", "+STR$(cmo%)
  739. '$endif ''DEBUG
  740.         ERROR STFERR
  741.     END IF
  742. END SUB
  743.  
  744.  
  745. '*************************************************************************
  746. SUB ShowProgmanGroup (szGroup$, Cmd%, cmo%) STATIC
  747. '$ifdef DEBUG
  748.     if szGroup$ = "" or len(szGroup$) > 24 then
  749.         BadArgErr 1, "ShowProgmanGroup", szGroup$+", "+STR$(Cmd%)+", "+STR$(cmo%)
  750.     end if
  751. '$endif ''DEBUG
  752.     IF FShowProgManGroup(szGroup$, STR$(Cmd%), cmo%) = 0 THEN
  753. '$ifdef DEBUG
  754.         StfApiErr saeFail, "ShowProgmanGroup", szGroup$+", "+STR$(Cmd%)+", "+STR$(cmo%)
  755. '$endif ''DEBUG
  756.         ERROR STFERR
  757.     END IF
  758. END SUB
  759.  
  760.  
  761.  
  762. '*************************************************************************
  763. SUB DumpCopyList (szFile$) STATIC
  764. '$ifdef DEBUG
  765.     if szFile$ = "" then
  766.         BadArgErr 1, "DumpCopyList", szFile$
  767.     end if
  768. '$endif ''DEBUG
  769.     IF FDumpCopyListToFile (szFile$) = 0 THEN
  770. '$ifdef DEBUG
  771.         StfApiErr saeFail, "DumpCopyList", szFile$
  772. '$endif ''DEBUG
  773.         ERROR STFERR
  774.     END IF
  775. END SUB
  776.  
  777.  
  778. '*************************************************************************
  779. SUB ClearCopyList STATIC
  780.     ResetCopyList
  781. END SUB
  782.  
  783.  
  784. '*************************************************************************
  785. FUNCTION GetCopyListCost (szExtraList$, szCostList$, szNeedList$) STATIC AS LONG
  786.     lNeed& = LcbGetCopyListCost (szExtraList$, szCostList$, szNeedList$)
  787.     IF lNeed& < 0 THEN
  788. '$ifdef DEBUG
  789.         StfApiErr saeFail, "GetCopyListCost", szExtraList$+", "+szCostList$+", "+szNeedList$
  790. '$endif ''DEBUG
  791.         ERROR STFERR
  792.     END IF
  793.     GetCopyListCost = lNeed&
  794. END FUNCTION
  795.  
  796.  
  797. '*************************************************************************
  798. SUB CreateProgmanItem (szGroup$, szItem$, szCmd$, szOther$, cmo%) STATIC
  799.     szItemNew$ = szItem$
  800.     IF szOther$ <> "" THEN
  801.         szItemNew$ = szItem$ + "," + szOther$
  802.     END IF
  803. '$ifdef DEBUG
  804.     if szGroup$ = "" or len(szGroup$) > 24 then
  805.         BadArgErr 1, "CreateProgmanItem", szGroup$+", "+STR$(Cmd%)+", "+STR$(cmo%)
  806.     end if
  807. '$endif ''DEBUG
  808.  
  809.     IF FCreateProgManItem(szGroup$, szItemNew$, szCmd$, cmo%) = 0 THEN
  810. '$ifdef DEBUG
  811.         StfApiErr saeFail, "CreateProgmanItem", szGroup$+", "+szItem$+", "+szCmd$+", "+szOther$+", "+STR$(cmo%)
  812. '$endif ''DEBUG
  813.         ERROR STFERR
  814.     END IF
  815.     szItemNew$ = ""
  816. END SUB
  817.  
  818.  
  819. '*************************************************************************
  820.  
  821. '*************************************************************************
  822. SUB CopyFilesInCopyList STATIC
  823.     grc% = GrcCopyFilesInCopyList (HinstFrame())
  824.  
  825.     IF grc% = grcUserQuit THEN
  826.         ERROR STFQUIT
  827.     ELSEIF grc% > 0 THEN
  828. '$ifdef DEBUG
  829.         StfApiErr saeFail, "CopyFilesInCopyList", ""
  830. '$endif ''DEBUG
  831.         ERROR STFERR
  832.     END IF
  833. END SUB
  834.  
  835.  
  836. '*************************************************************************
  837. SUB CopyFile (szFullPathSrc$, szFullPathDst$, cmo%, fAppend%) STATIC
  838. '$ifdef DEBUG
  839.     if FValidFATPath(szFullPathSrc$) = 0 then
  840.         n% = 1
  841.     elseif FValidFATPath(szFullPathDst$) = 0 then
  842.         n% = 2
  843.     else
  844.         n% = 0
  845.     end if
  846.     if n% > 0 then
  847.         BadArgErr n%, "CopyFile", szFullPathSrc$+", "+szFullPathDst$+", "+STR$(cmo%)+", "+STR$(fAppend%)
  848.     end if
  849. '$endif ''DEBUG
  850.  
  851.     IF  FCopyOneFile(szFullPathSrc$, szFullPathDst$, (cmo OR cmoCopy), fAppend%) = 0 THEN
  852. '$ifdef DEBUG
  853.         StfApiErr saeFail, "CopyFile", szFullPathSrc$+", "+szFullPathDst$+", "+STR$(cmo%)+", "+STR$(fAppend%)
  854. '$endif ''DEBUG
  855.         ERROR STFERR
  856.     END IF
  857. END SUB
  858.  
  859.  
  860.  
  861. '*************************************************************************
  862. SUB RemoveFile (szFullPathSrc$, cmo%) STATIC
  863. '$ifdef DEBUG
  864.     if FValidFATPath(szFullPathSrc$) = 0 then
  865.         BadArgErr 1, "RemoveFile", szFullPathSrc$+", "+STR$(cmo%)
  866.     end if
  867. '$endif ''DEBUG
  868.     IF  YnrcRemoveFile(szFullPathSrc$, cmo%) = ynrcNo THEN
  869. '$ifdef DEBUG
  870.         StfApiErr saeFail, "RemoveFile", szFullPathSrc$+", "+STR$(cmo%)
  871. '$endif ''DEBUG
  872.         ERROR STFERR
  873.     END IF
  874. END SUB
  875.  
  876.  
  877. '*************************************************************************
  878. SUB BackupFile (szFullPath$, szBackup$) STATIC
  879. '$ifdef DEBUG
  880.     if FValidFATPath(szFullPath$) = 0 then
  881.         n% = 1
  882.     elseif szBackup$ = "" then
  883.         n% = 2
  884.     else
  885.         n% = 0
  886.     end if
  887.     if n% > 0 then
  888.         BadArgErr n%, "BackupFile", szFullPath$+", "+szBackup$
  889.     end if
  890. '$endif ''DEBUG
  891.  
  892.     IF YnrcBackupFile(szFullPath$, szBackup$, cmoNone) = ynrcNo THEN
  893. '$ifdef DEBUG
  894.         StfApiErr saeFail, "BackupFile", szFullPath$+", "+szBackup$
  895. '$endif ''DEBUG
  896.         ERROR STFERR
  897.     END IF
  898. END SUB
  899.  
  900.  
  901. '*************************************************************************
  902. SUB AddSectionFilesToCopyList (szSect$, szSrc$, szDest$) STATIC
  903. '$ifdef DEBUG
  904.     if FValidInfSect(szSect$) = 0 then
  905.         n% = 1
  906.     elseif FValidFATDir(szSrc$) = 0 then
  907.         n% = 2
  908.     elseif FValidFATDir(szDest$) = 0 then
  909.         n% = 3
  910.     else
  911.         n% = 0
  912.     end if
  913.     if n% > 0 then
  914.         BadArgErr n%, "AddSectionFilesToCopyList", szSect$+", "+szSrc$+", "+szDest$
  915.     end if
  916. '$endif ''DEBUG
  917.  
  918.     IF FAddSectionFilesToCopyList (szSect$, szSrc$, szDest$) = 0 THEN
  919. '$ifdef DEBUG
  920.         StfApiErr saeFail, "AddSectionFilesToCopyList", szSect$+", "+szSrc$+", "+szDest$
  921. '$endif ''DEBUG
  922.         ERROR STFERR
  923.     END IF
  924. END SUB
  925.  
  926.  
  927. '*************************************************************************
  928. SUB AddSectionKeyFileToCopyList (szSect$, szKey$, szSrc$, szDest$) STATIC
  929. '$ifdef DEBUG
  930.     if FValidInfSect(szSect$) = 0 then
  931.         n% = 1
  932.     elseif szKey$ = "" then
  933.         n% = 2
  934.     elseif FValidFATDir(szSrc$) = 0 then
  935.         n% = 3
  936.     elseif FValidFATDir(szDest$) = 0 then
  937.         n% = 4
  938.     else
  939.         n% = 0
  940.     end if
  941.     if n% > 0 then
  942.         BadArgErr n%, "AddSectionKeyFileToCopyList", szSect$+", "+szKey$+", "+szSrc$+", "+szDest$
  943.     end if
  944. '$endif ''DEBUG
  945.  
  946.     IF FAddSectionKeyFileToCopyList (szSect$, szKey$, szSrc$, szDest$) = 0 THEN
  947. '$ifdef DEBUG
  948.         StfApiErr saeFail, "AddSectionKeyFileToCopyList", szSect$+", "+szKey$+", "+szSrc$+", "+szDest$
  949. '$endif ''DEBUG
  950.         ERROR STFERR
  951.     END IF
  952. END SUB
  953.  
  954.  
  955. '*************************************************************************
  956.  
  957.  
  958. '*************************************************************************
  959. SUB SetCopyGaugePosition (x%, y%) STATIC
  960.     ProSetPos x%, y%
  961. END SUB
  962.  
  963.  
  964. '*************************************************************************
  965. SUB MaximizeFrame STATIC
  966.     cx% = GetSystemMetrics (SM_CXSCREEN)
  967.     cy% = GetSystemMetrics (SM_CYSCREEN)
  968.     hWnd% = HwndFrame
  969.     bResult% = SetWindowPos (hWnd%,0,0,0,cx%,cy%,20)
  970. '    if cx% > 640 THEN
  971. '        StfApiErr saeFail, "SetWindowPos", "> 640!"
  972. '    END IF
  973. END SUB
  974.  
  975.  
  976. '*************************************************************************
  977. FUNCTION IsDirWritable (szDir$) STATIC AS INTEGER
  978.     IsDirWritable = FIsDirWritable(szDir$)
  979. END FUNCTION
  980.  
  981.  
  982. '*************************************************************************
  983. FUNCTION IsFileWritable (szFile$) STATIC AS INTEGER
  984. '$ifdef DEBUG
  985.     if FValidFATDir(szFile$) = 0 then
  986.         BadArgErr 1, "IsFileWritable", szFile$
  987.     end if
  988. '$endif ''DEBUG
  989.     IsFileWritable = FIsFileWritable(szFile$)
  990. END FUNCTION
  991.  
  992.  
  993. '*************************************************************************
  994. FUNCTION GetWindowsDir STATIC AS STRING
  995.     szBuf$ = string$(256, 32)
  996.     cbBuf% = GetWindowsDirectory(szBuf$, 256)
  997.  
  998.     IF cbBuf% = 0 THEN
  999.         GetWindowsDir = ""
  1000. '$ifdef DEBUG
  1001.         StfApiErr saeFail, "GetWindowsDir", ""
  1002. '$endif ''DEBUG
  1003.         ERROR STFERR
  1004.     ELSE
  1005.         IF cbBuf% > 255 THEN
  1006.             res% = DoMsgBox("Buffer Overflow", "MS-Setup Error", MB_ICONHAND+MB_OK)
  1007.             ERROR STFERR
  1008.         END IF
  1009.         szBuf$ = RTRIM$(szBuf$)
  1010.         IF MID$(szBuf$, 1, 1) = "\" THEN
  1011.             'szBuf$ = MID$(CURDIR$, 1, 2) + szBuf$
  1012.             szBuf$ = MID$(GetWindowsSysDir, 1, 2) + szBuf$
  1013.         ELSEIF MID$(szBuf$, 2, 1) <> ":" THEN
  1014.             szBuf$ = MID$(GetWindowsSysDir, 1, 3) + szBuf$
  1015.         END IF
  1016.         IF MID$(szBuf$, LEN(szBuf$), 1) <> "\" THEN
  1017.             szBuf$ = szBuf$ + "\"
  1018.         END IF
  1019.         GetWindowsDir = szBuf$
  1020.     END IF
  1021.  
  1022.     szBuf$ = ""
  1023. END FUNCTION
  1024.  
  1025.  
  1026. '*************************************************************************
  1027. FUNCTION GetWindowsSysDir STATIC AS STRING
  1028.     szBuf$ = string$(256, 32)
  1029.     cbBuf% = GetSystemDirectory(szBuf$, 256)
  1030.  
  1031.     IF cbBuf% = 0 THEN
  1032. '$ifdef DEBUG
  1033.         StfApiErr saeFail, "GetWindowsSysDir", ""
  1034. '$endif ''DEBUG
  1035.         ERROR STFERR
  1036.     ELSE
  1037.         IF cbBuf% > 255 THEN
  1038.             res% = DoMsgBox("Buffer Overflow", "MS-Setup Error", MB_ICONHAND+MB_OK)
  1039.             ERROR STFERR
  1040.         END IF
  1041.         szBuf$ = RTRIM$(szBuf$)
  1042.         IF MID$(szBuf$, 1, 1) = "\" THEN
  1043.             szBuf$ = MID$(CURDIR$, 1, 2) + szBuf$
  1044.         ELSEIF MID$(szBuf$, 2, 1) <> ":" THEN
  1045.             szBuf$ = MID$(CURDIR$, 1, 3) + szBuf$
  1046.         END IF
  1047.         IF MID$(szBuf$, LEN(szBuf$), 1) <> "\" THEN
  1048.             szBuf$ = szBuf$ + "\"
  1049.         END IF
  1050.         GetWindowsSysDir = szBuf$
  1051.     END IF
  1052.  
  1053.     szBuf$ = ""
  1054. END FUNCTION
  1055.  
  1056.  
  1057. '*************************************************************************
  1058. FUNCTION IsWindowsShared STATIC AS INTEGER
  1059.     szWin$ = UCASE$(GetWindowsDir())
  1060.     szSys$ = UCASE$(GetWindowsSysDir())
  1061.  
  1062.     IF len(szWin$) = 0 THEN
  1063. '$ifdef DEBUG
  1064.         StfApiErr saeFail, "IsWindowsShared", ""
  1065. '$endif ''DEBUG
  1066.         ERROR STFERR
  1067.     END IF
  1068.  
  1069.     IF len(szSys$) <= len(szWin$) THEN
  1070.         IsWindowsShared = 1
  1071.     ELSE
  1072.         szSys$ = MID$(szSys$, 1, len(szWin$))
  1073.         IF szWin$ = szSys$ THEN
  1074.             IsWindowsShared = 0
  1075.         ELSE
  1076.             IsWindowsShared = 1
  1077.         END IF
  1078.     END IF
  1079. END FUNCTION
  1080.  
  1081.  
  1082. '*************************************************************************
  1083. '*************************************************************************
  1084. SUB SetRestartDir (szDir$) STATIC
  1085. '$ifdef DEBUG
  1086.     if FValidFATDir(szDir$) = 0 then
  1087.         BadArgErr 1, "SetRestartDir", szDir$
  1088.     end if
  1089. '$endif ''DEBUG
  1090.     IF FSetRestartDir(szDir$) = 0 THEN
  1091. '$ifdef DEBUG
  1092.         StfApiErr saeFail, "SetRestartDir", szDir$
  1093. '$endif ''DEBUG
  1094.         ERROR STFERR
  1095.     END IF
  1096. END SUB
  1097.  
  1098.  
  1099. '*************************************************************************
  1100. FUNCTION RestartListEmpty STATIC AS INTEGER
  1101.     IF FRestartListEmpty() = 0 THEN
  1102.         RestartListEmpty = 0
  1103.     ELSE
  1104.         RestartListEmpty = 1
  1105.     END IF
  1106. END FUNCTION
  1107.  
  1108.  
  1109. '*************************************************************************
  1110. FUNCTION ExitExecRestart STATIC AS INTEGER
  1111.     ExitExecRestart = FExitExecRestart
  1112. END FUNCTION
  1113.  
  1114.  
  1115. '*************************************************************************
  1116.  
  1117.  
  1118. '**************************************************************************
  1119. '***************************  Error Handlers  *****************************
  1120. '**************************************************************************
  1121.  
  1122.  
  1123. '$ifdef DEBUG
  1124. '**************************************************************************
  1125. SUB StfApiErr (nMsg%, szApi$, szArgs$) STATIC      ''DEBUG only
  1126.     select case nMsg%
  1127.         case saeFail
  1128.             lpText$ = "Failed"
  1129.         case saeInit
  1130.             lpText$ = "Already Initialized"
  1131.         case saeNYI
  1132.             lpText$ = "NYI"
  1133.         case else
  1134.             lpText$ = "Bad Arg "+LTRIM$(STR$(nMsg% - saeArg))
  1135.     end select
  1136.  
  1137.     lpText$ = lpText$ + ": "+ szApi$
  1138.     if szArgs$ <> "" then
  1139.         lpText$ = lpText + " (" + szArgs$ + ")"
  1140.     end if
  1141.     lpCaption$ = "MS-Setup Toolkit API Error"
  1142.     res% = DoMsgBox(lpText$, lpCaption$, MB_TASKMODAL+MB_ICONHAND+MB_OK)
  1143.     print lpText$
  1144.     lpText$ = ""
  1145.     lpCaption$ = ""
  1146. END SUB
  1147.  
  1148. '**************************************************************************
  1149. SUB BadArgErr (nArg%, szApi$, szArgs$) STATIC      ''DEBUG only
  1150.     StfApiErr nArg%+saeArg, szApi$, szArgs$
  1151.     ERROR STFERR
  1152. END SUB
  1153.  
  1154.  
  1155. '** REVIEW: Move this function into common lib (we'll need it there too)
  1156. '**************************************************************************
  1157. FUNCTION FValidInfSect (szSect$) STATIC AS INTEGER
  1158.     if (szSect$ = "") OR (INSTR(1,szSect$,"]") <> 0) then
  1159.         FValidInfSect = 0
  1160.     else
  1161.         FValidInfSect = 1
  1162.     end if
  1163. END FUNCTION
  1164.  
  1165.  
  1166. '** REVIEW: Move this function into common lib (we'll need it there too)
  1167. '**************************************************************************
  1168. FUNCTION FValidIniFile (szFile$) STATIC AS INTEGER
  1169.     if (FValidFATPath(szFile$) = 0) AND (UCASE$(szFile$) <> "WIN.INI") then
  1170.         FValidIniFile = 0
  1171.     else
  1172.         FValidIniFile = 1
  1173.     end if
  1174. END FUNCTION
  1175.  
  1176. '**************************************************************************
  1177. FUNCTION FValidDrive (szDrive$) STATIC AS INTEGER
  1178.  
  1179.     if szDrive$ = "" then
  1180.         FValidDrive = 0
  1181.     elseif INSTR(1,szDrive$,"\\") = 1 then   ' UNC path
  1182.         FValidDrive = 1
  1183.     elseif ASC(UCASE$(szDrive$)) - ASC("A") < 0 then
  1184.         FValidDrive = 0
  1185.     elseif ASC(UCASE$(szDrive$)) - ASC("A") > 25 then
  1186.         FValidDrive = 0
  1187.     elseif LEN(szDrive$) = 1 then
  1188.         FValidDrive = 1
  1189.     elseif INSTR(2,szDrive$,":\") = 2 then
  1190.         FValidDrive = 1
  1191.     elseif INSTR(1,szDrive$,":") = 2 then
  1192.         FValidDrive = 1
  1193.     else
  1194.         FValidDrive = 0
  1195.     end if
  1196. END FUNCTION
  1197.  
  1198. '$endif ''DEBUG
  1199.  
  1200.  
  1201. TRAP CleanupTrap From "MSSHLSTF.DLL"
  1202.  
  1203. End Trap
  1204.  
  1205. hSetup = InitSetup(COMMAND$)
  1206.  
  1207. ON ERROR GOTO QUIT
  1208.  
  1209.